/**
 * 
 */
package org.gfids.trivial.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;




/**
 * @author madtyn
 *
 */
@Entity
@Table(name="trivial")
public class Cuestion implements java.io.Serializable {

	@Transient
	private transient static final long serialVersionUID = 1L;
	private Long id;
	private String pregunta;
	private List<String> respuestas;
	private Byte dificultad;
	
	public Cuestion() {}
	
	/**
	 * Creates a Cuestion object containing the question to ask
	 * as well as the correct answer with the optional false ones.
	 * 
	 * Crea un objeto cuestion conteniendo la pregunta a realizar
	 * así como la respuesta correcta con sus opcioens falsas
	 * 
	 * @param p  The question being answered. La pregunta
	 * @param s1 The solution or true answer to the question. La solución correcta
	 * @param s2 The first false option. La primera opción falsa
	 * @param s3 The second false option. La segunda opción falsa
	 * @param s4 The third false option. La tercera opción falsa.
	 */
	public Cuestion(String p, String s1, String s2, String s3, String s4) {
		pregunta = p;
		dificultad = null;
		respuestas = new ArrayList<String>(4);
		respuestas.add(s1);
		respuestas.add(s2);
		respuestas.add(s3);
		respuestas.add(s4);
	}
	
	/**
	 * @return Un nuevo objeto Cuestion con las respuestas desordenadas
	 * 
	 * A new Cuestion object with the answers shuffled.	   
	 */
	@SuppressWarnings("unchecked")
	@Transient
	public Cuestion getTrivialCuestion() {
		List<String> respuestasDesordenadas = (List) ((ArrayList<String>)respuestas).clone();
		Collections.shuffle(respuestasDesordenadas);
		
		return new Cuestion(pregunta, respuestasDesordenadas.get(0),
							          respuestasDesordenadas.get(1),
							          respuestasDesordenadas.get(2),
							          respuestasDesordenadas.get(3));
	}

	@Column(name="idPregunta")
	@SequenceGenerator(name="IdPregGenerator", sequenceName="PregSeq")
	@Id 
	@GeneratedValue(strategy = GenerationType.AUTO, generator="IdPregGenerator")
	public Long getId() {
		return id;
	}

	@Column(name="pregunta")
	public String getPregunta() {
		return pregunta;
	}

	@Column(name="respuesta")
	public String getRespuesta1() {
		return respuestas.get(0);
	}

	@Column(name="respuesta2")
	public String getRespuesta2() {
		return respuestas.get(1);
	}

	@Column(name="respuesta3")
	public String getRespuesta3() {
		return respuestas.get(2);
	}
	
	@Column(name="respuesta4")
	public String getRespuesta4() {
		return respuestas.get(3);
	}

	@Column(name="dificultad")
	public Byte getDificultad() {
		return dificultad;
	}

	public void setDificultad(byte dificultad) {
		this.dificultad = dificultad;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setPregunta(String pregunta) {
		this.pregunta = pregunta;
	}

	public void setRespuesta1(String respuesta1) {
		this.respuestas.set(0, respuesta1);
	}
	
	public void setRespuesta2(String respuesta2) {
		this.respuestas.set(1, respuesta2);
	}

	public void setRespuesta3(String respuesta3) {
		this.respuestas.set(2, respuesta3);
	}

	public void setRespuesta4(String respuesta4) {
		this.respuestas.set(3, respuesta4);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + dificultad;
		result = prime * result
				+ ((pregunta == null) ? 0 : pregunta.hashCode());
		result = prime * result
				+ ((respuestas == null) ? 0 : respuestas.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cuestion other = (Cuestion) obj;
		if (dificultad != other.dificultad)
			return false;
		if (pregunta == null) {
			if (other.pregunta != null)
				return false;
		} else if (!pregunta.equals(other.pregunta))
			return false;
		if (null == respuestas) {
			if (null != other.respuestas)
				return false;
		} else {
				for(int i=0; i< respuestas.size(); i++)
					if (!respuestas.get(i).equals(other.respuestas.get(i)))
						return false;
		}
		return true;
	}

	
		
	

}
